// Promise 并行执行

function ajax (url) {
    return new Promise(function (resolve, reject) {
        var xhr = new XMLHttpRequest()
        xhr.open('GET', url)
        xhr.responseType = 'json'
        xhr.onload = function () {
            if (this.status === 200) {
                resolve(this.response)
            } else {
                reject(new Error(this.statusText))
            }
        }
        xhr.send()
    })
}

// ajax('/api/users.json')
// ajax('/api/posts.json')

// 传统做法以计数器控制判断

// Promise.all / Promise.race 

// var promise = Promise.all([
//     ajax('/api/users.json'),
//     ajax('/api/posts.json')
// ])
// promise.then(function (values) {
//     console.log(values)
// }).catch(function (err) {
//     console.log(err)
// })

// ajax('/api/urls.json')
//     .then(value => {
//         const urls = Object.values(value)
//         const tasks = urls.map(url => ajax(url))
//         return Promise.all(tasks)
//     })
//     .then(values => {
//         console(values)
//     })

const request = ajax('/api/posts.json')
const timeout = new Promise((resolve, reject) => {
    setTimeout(() => reject(new Error('timeout')), 500)
})
Promise.race(
    [request, timeout]
)
.then(values => {
    console.log(values)
})
.catch(err => {
    console.log(err)
})